package model

import (
	"encoding/json"
	"errors"
	"mail/app/config"
	"mail/app/utils"
	"regexp"
)

/**
 * 构造函数, 得到实例
 */
func NewAdmin() *Admin {
	temp := &Admin{
	}

	return temp
}

/**
 * 禁用用户账户
 */
func (u *Admin) Forbid(cont string) (err error) {
	config.GetLogger().Info("开始解析禁用账户数据")
	user := new(UserID)
	i := new(Info)
	err = json.Unmarshal([]byte(cont), &user)
	if err != nil {
		config.GetLogger().Warnw("数据解析失败",
			"err: ", err,
		)
		return err
	}
	config.GetLogger().Info("解析禁用账户数据结束")

	config.GetLogger().Info("开始检查用户类型")
	userType := 0
	err = db.Table("user_info").Select("type").Where("id = ?", user.UserID).Scan(&userType).Error
	if err != nil {
		config.GetLogger().Warnw("检查用户类型失败",
			"err: ", err,
		)
		return
	}
	if userType == 0 {
		return errors.New("无法封禁管理员账号")
	} else if userType == 2 {
		return errors.New("该用户已被封禁")
	}
	config.GetLogger().Info("检查用户类型结束")

	config.GetLogger().Info("开始封禁用户账号")
	err = db.Table("user_info").Model(&i).Where("id = ?", user.UserID).Updates(map[string]interface{}{"type": 2}).Error
	if err != nil {
		config.GetLogger().Warnw("封禁用户账号失败",
			"err", err,
		)
		return
	}
	config.GetLogger().Info("封禁用户账号结束")

	return
}

/**
 * 管理员禁用IP
 */
func (u *Admin) ForbidIP(cont string) (err error) {
	count := 0

	config.GetLogger().Info("开始解析数据")
	user := new(ForbidIP)
	err = json.Unmarshal([]byte(cont), &user)
	if err != nil {
		config.GetLogger().Warnw("数据解析失败",
			"err: ", err,
		)
		return err
	}
	config.GetLogger().Info("解析数据结束")

	config.GetLogger().Info("开始禁用IP")
	matchResult, _ := regexp.MatchString(`^([0-9]{1,3}\\.){3}[0-9]{1,3}$`, user.IP)
	if !matchResult {
		return errors.New("IP地址错误")
	}

	db.Table("filter").Where("address = ?", user.IP).Count(&count)

	if count != 0 {
		return errors.New("IP已存在")
	}

	i := new(ForbiddenIP)
	i.IP = user.IP

	err = db.Table("IP").Create(&i).Error
	if err != nil {
		config.GetLogger().Warnw("禁用IP地址失败",
			"err: ", err,
		)
		return err
	}

	config.GetLogger().Info("禁用IP结束")

	return
}

/**
 * 管理员查看用户列表
 */
func (u *Admin) GetUserList() (userList []UserInfo, err error) {

	config.GetLogger().Info("开始获取用户列表")
	rows, err := db.Table("users").Select("id, user_name,user_passwd, user_type, user_email, smtp_state, pop_state").Rows()
	if err != nil {
		config.GetLogger().Warnw("获取用户列表失败",
			"err: ", err,
		)
		return
	}

	for rows.Next() {
		user := new(UserInfo)

		err = rows.Scan(&user.UserId, &user.UserName, &user.UserPwd, &user.UserType, &user.UserEmail, &user.SMTPStatus, &user.POPStatus)
		if err != nil {
			config.GetLogger().Warnw("数据获取错误",
				"err:", err,
			)
			return
		}
		userList = append(userList, *user)
	}
	config.GetLogger().Info("获取用户列表结束")

	return
}

/**
 * 管理员禁用用户的邮件收发
 */
func (u *Admin) ForbidService(cont string) (err error) {

	config.GetLogger().Info("开始解析数据")
	forbidService := new(ForbidService)
	err = json.Unmarshal([]byte(cont), &forbidService)
	if err != nil {
		config.GetLogger().Warnw("数据解析失败",
			"err: ", err,
		)
		return err
	}
	config.GetLogger().Info("解析数据结束")

	config.GetLogger().Info("开始禁用用户的smtp或pop服务")
	if forbidService.Operate == "off" {
		if forbidService.Type == "smtp" {
			service := new(Users)
			err = db.Table("users").Model(&service).
				Where("id = ?", forbidService.UserID).
				Updates(map[string]interface{}{"smtp_state": "F"}).Error
			if err != nil {
				config.GetLogger().Warnw("禁用用户smtp服务错误",
					"err", err,
				)
				return
			}
		} else if forbidService.Type == "pop" {
			service := new(Users)
			err = db.Table("users").Model(&service).
				Where("id = ?", forbidService.UserID).
				Updates(map[string]interface{}{"pop_state": "F"}).Error
			if err != nil {
				config.GetLogger().Warnw("禁用用户pop服务错误",
					"err", err,
				)
				return
			}
		} else {
			return errors.New("禁用类型错误")
		}
	} else if forbidService.Operate == "on" {
		if forbidService.Type == "smtp" {
			service := new(Users)
			err = db.Table("users").Model(&service).
				Where("id = ?", forbidService.UserID).
				Updates(map[string]interface{}{"smtp_state": "T"}).Error
			if err != nil {
				config.GetLogger().Warnw("解禁用户smtp服务错误",
					"err", err,
				)
				return
			}
		} else if forbidService.Type == "pop" {
			service := new(Users)
			err = db.Table("users").Model(&service).
				Where("id = ?", forbidService.UserID).
				Updates(map[string]interface{}{"pop_state": "T"}).Error
			if err != nil {
				config.GetLogger().Warnw("解禁用户pop服务错误",
					"err", err,
				)
				return
			}
		} else {
			return errors.New("禁用类型错误")
		}
	} else {
		return errors.New("操作类型错误")
	}

	config.GetLogger().Info("禁用用户的smtp或pop服务结束")

	return
}

/**
 * 管理员对邮件服务器的启停
 */
func (u *Admin) ServiceControl(cont string) (err error) {

	config.GetLogger().Info("开始解析数据")
	forbidService := new(ForbidService)
	err = json.Unmarshal([]byte(cont), &forbidService)
	if err != nil {
		config.GetLogger().Warnw("数据解析失败",
			"err: ", err,
		)
		return err
	}
	config.GetLogger().Info("解析数据结束")

	config.GetLogger().Info("开始控制服务器的启停")
	if forbidService.Operate == "off" {
		if forbidService.Type == "smtp" {
			service := new(Server)
			err = db.Table("server").Model(&service).
				Where("id = ?", 1).
				Updates(map[string]interface{}{"smtp_on": "F"}).Error
			if err != nil {
				config.GetLogger().Warnw("控制服务器的启停错误",
					"err", err,
				)
				return
			}
		} else if forbidService.Type == "pop" {
			service := new(Server)
			err = db.Table("server").Model(&service).
				Where("id = ?", 1).
				Updates(map[string]interface{}{"pop_on": "F"}).Error
			if err != nil {
				config.GetLogger().Warnw("控制服务器的启停错误",
					"err", err,
				)
				return
			}
		} else {
			return errors.New("禁用类型错误")
		}
	} else if forbidService.Operate == "on" {
		if forbidService.Type == "smtp" {
			service := new(Server)
			err = db.Table("server").Model(&service).
				Where("id = ?", 1).
				Updates(map[string]interface{}{"smtp_on": "T"}).Error
			if err != nil {
				config.GetLogger().Warnw("控制服务器的启停错误",
					"err", err,
				)
				return
			}
		} else if forbidService.Type == "pop" {
			service := new(Server)
			err = db.Table("server").Model(&service).
				Where("id = ?", 1).
				Updates(map[string]interface{}{"pop_on": "T"}).Error
			if err != nil {
				config.GetLogger().Warnw("控制服务器的启停错误",
					"err", err,
				)
				return
			}
		} else {
			return errors.New("禁用类型错误")
		}
	} else {
		return errors.New("操作类型错误")
	}

	config.GetLogger().Info("控制服务器的启停结束")

	return
}

/**
 * 管理员查看当前服务器启停状态
 */
func (u *Admin) CheckServiceStatus() (Server ServerStatus, err error) {

	config.GetLogger().Info("开始查询服务器的启停状态")
	row := db.
		Table("server").
		Select("smtp_on, pop_on").
		Where("id = ?", 1).Row()
	err = row.Scan(&Server.SmtpStat, &Server.PopStat)
	if err != nil {
		config.GetLogger().Warnw("查询服务器的启停状态错误",
			"err", err,
		)
		return
	}
	config.GetLogger().Info("查询服务器的启停状态结束")

	return
}

/**
 * 管理员重置用户密码
 */
func (u *Admin) ResetUserPwd(cont string) (err error) {

	config.GetLogger().Info("开始解析数据")
	user := new(UserID)
	err = json.Unmarshal([]byte(cont), &user)
	if err != nil {
		config.GetLogger().Warnw("数据解析失败",
			"err: ", err,
		)
		return err
	}
	config.GetLogger().Info("解析数据结束")

	config.GetLogger().Info("开始重置用户密码")
	UserPwd := utils.EncodeMd5("88888888")

	err = db.Table("users").
		Where("id = ?",user.UserID).
		Updates(map[string]interface{}{"user_passwd": UserPwd}).Error
	if err != nil {
		config.GetLogger().Warnw("重置用户密码错误",
			"err", err,
		)
		return
	}
	config.GetLogger().Info("重置用户密码结束")

	return
}
